from django.shortcuts import render
from django.http import HttpResponse, HttpResponseNotAllowed, JsonResponse, FileResponse
from django.shortcuts import redirect, reverse
from product.models import Product
import json

def index(request, year, day):
    print(year, day)
    return HttpResponse('首页')

def year_month_phone(request, year,month,phone):
    print(year, month, phone)
    return HttpResponse(f'手机生产于{year}{month}, 手机号是{phone}')

def search_view(request):
    # URL ?参数1=值 & 参数2=值
    # http://127.0.0.1:8000/search
    # ?keywork=python
    # &category=book
    # &page=2

    # 获取查询字符串 获取参数
    # requst.GET 是一个字典对象，用于存储查询字符串中的参数
    # 可以通过键来访问参数的值
    # 用于get 请求
    print(request.GET) 
    # <QueryDict: {'keyword': ['python']}>
    keyword = request.GET.get('keyword')
    category = request.GET.get('category')
    
    # 如果有多个同名参数，可以使用getlist()方法
    # keyword = request.GET.getlist('keyword')
    # for i in keyword:
    #     if i == "python":
    #         return HttpResponse("python 是最好的语言")
    return HttpResponse(f"查询的关键字是{keyword}, 分类是{category}")

def post_view(request):
    # 用于post 请求 
    # 表单提交的数据 form-data  
    # request.POST 是一个字典对象，用于存储表单提交的数据
    username = request.POST.get('username')
    password = request.POST.get('password')
    content_type = request.META.get('CONTENT_TYPE') # multipart/form-data
    print(content_type)
    return HttpResponse(f"用户名是{username}, 密码是{password}")

    # 如果是json 格式的数据，可以使用request.body 来获取
    # b'{\n    "username":"zhangsan",\n    "password": "1234"\n}'
    # json_str = request.body
    # 把json 字符串转换为python 字典
    # {'username': 'zhangsan', 'password': '1234'}
    # data = json.loads(json_str)
    # username = data.get('username')
    # pwd = data.get('password')
    
    content_type = request.META.get('CONTENT_TYPE') # application/json
    print(content_type)
    # return HttpResponse(f"用户名是{username}, 密码是{pwd}")
    
def LoginView(requets):
    # 支持 post 和get 请求
    if requets.method == "POST":
        username = requets.POST.get('username')
        password = requets.POST.get('password')
        print(username)
        # 文件上传
        files = requets.FILES.get('pic')
        if files:
            # 保存文件到服务器
            print("文件名:", files.name)
            print("文件大小:", files.size)
            
            with open(files.name, 'wb+') as f:
                # 将上传的文件分块(chunk)写入到服务器
                # 分块写入的好处是可以避免一次性将整个文件加载到内存中，从而避免内存占用过大的问题
                for chunk in files.chunks():
                    f.write(chunk)
                    return HttpResponse(f"{files.name}文件上传成功")
        return HttpResponse(f"用户名是{username}, 密码是{password}")

    elif requets.method=="GET":
        username = requets.GET.get('username')
        # 获取当前的用户对象
        # 由于当前还没有登录，所以返回AnonymousUser，未登录用户
        user = requets.user
        # path 是当前的路径
        request_path = requets.path
        # 构造字典数据
        data = {
         "username": username,
  
         "path": request_path   
        }
        # 返回json 数据, 把字典转换为json 字符串
        # json_str = json.dumps(data)
        # return HttpResponse(json_str, status=200)
        
        # 直接返回字典
        # return JsonResponse(data, status=200)
        
        # 重定向到其他页面
        # 路径反解析，结合视图函数的名称，返回对应的url 路径
        reverse_url = reverse('del')
        
        return redirect(reverse_url)
    else:
        # 抛出405 的错误
        return HttpResponse('不支持的请求方法', status=405)

def download_file(request):
    # 下载文件
    # 提供文件下载功能
    # 1. 读取文件内容
    file = open('/Users/tunan/Documents/课程/32期/shopping/hk_shopping/images/IT互联网科技风人工智能banner.jpg', 'rb')

    # 创建fileresponse 对象
    response = FileResponse(
       file,  # 文件对象
       filename="用户上传的图片.jpg",  # 下载的时候显示的文件名
       as_attachment=True, # 强制下载，而不是在浏览器中打开
       content_type="image/jpeg", # 文件的MIME类型
       status=200, # HTTP状态码
    )
    return response

def productView(request):
    # name = "小米15pro"
    # price = "1000.00"
    # descpritions = "照相手机"
    
    # 数据库，把数据库的数据进行返回

    """
    数据增加方法，.save()和.create()方法
    保存到模型类中
    """
    try:
        # # 创建product模型实例对象
        # product = Product(
        #     product_name="小米14Pro",
        #     cover =  "",
        #     price = 5000,
        #     popularity = 100,
        #     stock=100,
        #     is_active = False,
        # )
        # # 将创建的产品实例保存到数据库中
        # product.save()

        # create() 一步直接保存到数据库 直接创建并保存到数据库
        # 通过模型管理器Model.objects 调用  
        # Model Manager 作用： 模型与数据库交互的核心接口
        # 封装了所有数据库查询和操作的方法 
        # 每一个Django模型默认都有一个名为objects的管理器
        Product.objects.create(
            product_name="小米18Pro",
            cover =  "",
            price = 5000,
            popularity = 100,
            stock=100,
            is_active = False,
            )
        
    except Exception as e:
        return HttpResponse(f"异常原因：{e}")
        

    return HttpResponse("ok")


def productUpdateView(request):
    """
    修改方法
    save() 和 .update()
    1.查询实例
    2.修改字段
    3.保存
    """

    # 修改单个模型实例并保存
    # 1.查询实例 .get() 获取单个实例对象 通过主键（id）查询  在Django里面 pk=id 字段
    # 模型类.objects.get()
    # 模型实例（单个结果）
    product = Product.objects.get(pk=5)
    
    # 2.修改字段 给类属性重新赋值
    product.stock = 900
    product.price = 5500
    product.popularity = 100000
    product.is_active = True
    # 3.保存
    product.save()

    # filter() 查询方法
    #  查询集(多个结果)(QuerySet)  filter() 返回出来的结果
    # a = Product.objects.filter(pk=5)
    # print(a)

    # Product.objects.filter(pk=5).update(stock=200, price=3000, is_active=True)


    return HttpResponse("ok")

def ProductDelView(request):
    """
    删除方法 delete()
    """
    # 单个模型实例的删除
    Product.objects.get(pk=15).delete()

    # Product.objects.filter(pk=9).delete()
    return HttpResponse('ok')

